package chapter5.homework.heima.Q4updateFilesAndPreventDuplicateNames;

import java.io.*;
import java.net.InetAddress;
import java.net.Socket;

/**
 * @Project ：learn_java
 * @File ：Clinet.java
 * @IDE ：IntelliJ IDEA
 * @Author ：自由如风间
 * @Date ：2025/3/16 17:09
 * @Description ：For study.
 */

public class Client {
    public static void main(String[] args) throws IOException {

        String localhost = InetAddress.getLocalHost().getHostAddress();
        Socket socket = getSocket(localhost);

        // 读取服务器的反馈信息
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        String line = br.readLine();
        System.out.println(line);

        // 释放资源
        socket.close();
    }

    public static boolean checkDuplicate(String name) {
        return false;
    }

    // idea生成的提取方法
    // 这个方法在题3还合适，但在这里反而不适合，这个函数的功能已经不单一了
    private static Socket getSocket(String localhost) throws IOException {
        // samePort表示客户端和服务器都使用相同的一个端口。
        int samePort = 10086;
        Socket socket = new Socket(localhost, samePort);

        // 需要上传文件的路径
        // 可以出一个文件选取的功能，但这里因为学习需求，指定一个固定文件
        String updateFileDir = "G:\\codes\\learn_java\\images\\aoa.webp";

        // 因为要重名检查处理，所有程序应先上传文件名给服务器，确认可行后再上传
        String fileName = updateFileDir.substring(updateFileDir.lastIndexOf("\\") + 1);

        if (!checkDuplicate(fileName)) {
            System.out.println("文件：" + fileName + " 已经上传过了，上传已取消");
            System.exit(0);
        }

        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(updateFileDir));
        BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());

        byte[] bytes = new byte[1024];
        int len;
        while ((len = bis.read(bytes)) != -1) {
            bos.write(bytes, 0, len);
        }

        bos.flush();
        // 往服务器写出结束标记
        socket.shutdownOutput();
        return socket;
    }
}
